package BDD.gestionnaires; 

import javax.ejb.Stateless;

import java.util.Collection;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import BDD.modeles.*;  
import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0.0
 * @author AZRIA Nouriel
 */
@Stateless
public class GestionnaireAlbum {

    // Ici injection de code : on n'initialise pas. L'entity manager sera créé  
    // à partir du contenu de persistence.xml  
    @PersistenceContext  
    private EntityManager em;
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    
    /* LES METHODES */
    
    public Album creeAlbum(Utilisateur utilisateur, String name, boolean isPrivate) {  
        
        // Creer l'album
        Album a = new Album(name, isPrivate);
        
        // Ajouter l'album chez l'utilisateur
        utilisateur.addAlbums(a);
        a.setUtilisateur(utilisateur);
        // Persister dans la BD
        em.persist(a);
        return a;  
    }
    
    public Collection<Photo> getPhotosOfAlbum(int idAlbum){
        Album album = em.find(Album.class, idAlbum);
        return album.getPhotos();
    }
  
    public Collection<Album> getAllAlbums() {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select a from Album a");  
        return q.getResultList();  
    }
    
    /**
     * Methode permettant de renvoyer un album par son id
     * @param id id de l'album
     * @return un album
     */
    public Album getAlbum(int id) {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("SELECT a FROM Album a WHERE a.id=:id");  
        
        // Lier le nom au parametre
        q.setParameter("id", id);
        q.setMaxResults(1);
        
        // Renvoyer le resultat
        return (Album)(q.getSingleResult());
    }
    
    public Collection<Album> getAlbumsOfUser(Utilisateur u) {  
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select a from Album a");
        q.setParameter("id", u.getId());
        return q.getResultList();  
    }
    
    /**
     * Verifie si l'album existe (par son id)
     * @param idAlbum
     * @return true ou false
     */
    public boolean albumExists(int idAlbum){ 

         // Initialiser le retour
         boolean exist = true;

         // Essayer de recuperer
         String rq = "SELECT a FROM Album a WHERE a.id=:idAlbum";
         Query q = em.createQuery(rq);
         q.setParameter("idAlbum", idAlbum);
         q.setMaxResults(1);

         // Verifier s'il y a un resultat
         try{
             q.getSingleResult();
         } 
         catch(javax.persistence.NoResultException e){
             exist = false;
         }

         // Renvoyer le resultat
         return exist;
    }
    
    /**
     * Methode eprmettant de recuperer un album par son id
     * @param idAlbum
     * @return la photo ou null
     */
    public Album recupererAlbum(int idAlbum){ 

        // Initialiser le retour
        Album p = null;
        
         // Essayer de recuperer
         String rq = "SELECT a FROM Album a WHERE a.id=:idAlbum";
         Query q = em.createQuery(rq);
         q.setParameter("idAlbum", idAlbum);
         q.setMaxResults(1);

         // Verifier s'il y a un resultat
         try{
             p = (Album) q.getSingleResult();
         } 
         catch(javax.persistence.NoResultException e){}

         // Renvoyer le resultat
         return p;
    }
    
    /**
     * Methode permettant de recuperer la liste complete des albums publics
     * @return liste albums publics
     */
    public Collection<Album> recupererAlbumsPublics(){ 

        // Initialiser le retour
        Collection<Album> listeAlbums = new ArrayList<Album>();
        
         // Essayer de recuperer
         boolean valBool = false;
         String rq = "SELECT a FROM Album a WHERE a.isPrivate=:valBool";
         Query q = em.createQuery(rq);
         q.setParameter("valBool", valBool);

         // Verifier s'il y a des resultats
         try{
             listeAlbums = q.getResultList();
         } 
         catch(javax.persistence.NoResultException e){}

         // Renvoyer le resultat
         return listeAlbums;
    }
    
    /**
     * Methode permettant de supprimer un album
     * @param a l'album
     */
    public void supprimerAlbum(Album a){
        
        // --- Reconnecter l'album --- //
        Album AlbumConnecte = em.merge(a);
        AlbumConnecte = em.find(Album.class, AlbumConnecte.getId());
        
        // --- Suppression de l'album --- //
        // ------------------------------ //
        
        // Retirer l'album de l'utilisateur
        Utilisateur utilisateurConnecte = em.merge(AlbumConnecte.getUtilisateur());
        utilisateurConnecte = em.find(Utilisateur.class, utilisateurConnecte.getId());
        utilisateurConnecte.removeAlbums(AlbumConnecte);
        
        // Supprimer la photo de la base
        em.remove(AlbumConnecte);

    }
    
    // --- Methode IMPORTANTE pour la reception des lists de maniere correcte (en se connectant correctement a la BD)
    public Collection<Photo> getPhotos(Album album) {
        // user est non connecté si on appelle cette méthode depuis un endroit 
        // où le gestionnaire de persistence em n'existe pas. 
        // C'est le cas si on appelle depuis une servlet ou une jsp
        
        // On reconnecte l'object
        Album albumConnecte = em.merge(album);
        //em.refresh(userConnecte);
        
        // ok, on a un user connecté, on va faire un getAlbums() pour
        // monter en mémoire les albums depuis la base, et on renvoie
        // l'utilisateur
        //System.out.println(userConnecte + " nb albums : " + userConnecte.getAlbums().size());
        
        Album a = em.find(Album.class, albumConnecte.getId());
        //System.out.println("Second test albums de user 1 : " + u.getAlbums());
        return a.getPhotos();
    }
    
}
